package com.bjfu.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    private static final String KEY = "xxiao";

    // 接收业务数据, 生成token并返回
    public static String genToken(Long userId, Integer role,Integer status) {
        return JWT.create()
                .withClaim("userId", userId)  // 放入 userId
                .withClaim("role", role)      // 放入 role
                .withClaim("status",status)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60* 12))  // 12小时过期
                .sign(Algorithm.HMAC256(KEY));  // 使用 HMAC256 加密算法
    }

    // 接收token, 验证token, 并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        // 获取 token 中的 claims 并返回一个 Map<String, Object>
        Map<String, Object> claimsMap = new HashMap<>();
        try {
            Map<String, Claim> claims = JWT.require(Algorithm.HMAC256(KEY))
                    .build()
                    .verify(token)
                    .getClaims();

            // 将 Claim 对象转换为实际值并存入 Map
            for (Map.Entry<String, Claim> entry : claims.entrySet()) {
                claimsMap.put(entry.getKey(), entry.getValue().as(Object.class)); // 使用 as(Object.class) 转换
            }

            return claimsMap;
        } catch (Exception e) {
            throw new RuntimeException("Token解析失败", e);
        }
    }


    // 获取 token 中的 userId 和 role
    public static Long getUserId(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("userId")
                .asLong();
    }

    public static Integer getRole(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("role")
                .asInt();
    }
}
